package com.ruoyi.project.drug.redis.impl;

import com.ruoyi.project.drug.redis.RedisDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis访问实现类型。
 * 访问Redis数据库，实现数据的增删改查功能。
 * 基于Spring Data Redis实现。 使用RedisTemplate客户端对象实现功能。
 */
@Repository
public class RedisDaoImpl implements RedisDao {
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;

    @Override
    public void set(String key, Object value) {
        // 保存键值对
        redisTemplate.opsForValue().set(key, value);
    }

    @Override
    public void set(String key, Object value, Long expire, TimeUnit unit) {
        // 保存键值对，同时设置有效时长
        redisTemplate.opsForValue().set(key, value, expire, unit);
    }

    @Override
    public <T> T get(String key) {
        // 根据key查询value， RedisTemplate泛型是<Object, Object> 那么查询的结果对象类型是Object。实际对象类型是你保存的对象类型。
        // 返回的时候，直接强制类型转换成泛型类型 T。 由调用者决定，查询的value具体类型是什么。
        Object rtnValue = redisTemplate.opsForValue().get(key);
        return (T) rtnValue;
    }

    @Override
    public void del(String key) {
        // 删除键值对。忽略value的具体内容，只要key存在，就删除。key不存在，则不做处理。
        redisTemplate.delete(key);

    }

    @Override
    public <T> Set<T> keys(String pattern) {
        return (Set<T>) redisTemplate.keys(pattern);
    }

    @Override
    public void expire(String key, Long expire, TimeUnit unit) {
        // 设置键值对的有效时长  expire key seconds
        redisTemplate.expire(key, expire, unit);
    }

    @Override
    public long ttl(String key) {
        // 查询键值对的剩余有效时长 ttl key  . 返回单位是秒的长整数。代表剩余有效时长还有多少秒。 -1 永久保存； -2 key不存在
        return redisTemplate.getExpire(key);
    }

    @Override
    public void persist(String key) {
        // 删除键值对的有效时长
        redisTemplate.persist(key);
    }
}
